package com.bdqn.design.singleton;

/**
 * Singleton04 单例模式（四：内部类）
 *
 * @author LILIBO
 * @since 2023-10-25
 */
public class Singleton04 {

    private String message;

    /**
     * 内部类，构建对象
     */
    private static class SingletonHolder {

        // 该类的唯一对象
        private static final Singleton04 instance = new Singleton04();

    }

    // ① 私有化构造方法
    private Singleton04() {
        this.message = "100G ...";
        try {
            System.out.println("构造方法（JVM启动时不会执行）");
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    // ② 提供一个静态的公有方法，返回创建的或者获取本身的静态私有对象
    public static Singleton04 getInstance() {
        System.out.println("获取实例（在用到的时候由JVM创建内部类，实例化持有的对象）");
        return SingletonHolder.instance;
    }

    // 模拟序号
    private int index = 0;

    /**
     * 获取下一个序号
     *
     * @return
     */
    public synchronized int next() {
        return ++index;
    }

}
